/***********************************************************************************
 * 文件名： soft_fifo.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		一个软件模拟的FIFO控制器类。仅支持单字节数据存取。使用前需要先定义实例，可以实例化多
 *  个对象。
 *      注意：暂不支持在不同线程同时操作同一个SoftFifo实例，如果这么做程序将会出现异常，需要
 *  自己处理资源互斥问题。
 * 修改记录：
 * 	2021/2/3: 初版。 刘言。
***********************************************************************************/
#ifndef _SOFT_FIFO_H_
#define _SOFT_FIFO_H_

#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
 extern "C" {
#endif

// 软件模拟的FIFO控制类SoftFifo（仅属性）
typedef struct _soft_fifo
{
    uint8_t *Buff;           // 缓存地址
    //uint16_t DataSize;       // 单个数据尺寸(本文件始终为1)
    uint16_t BuffSize;       // 缓存尺寸（单个数据尺寸为单位）
    uint16_t InPointer;      // 头标记
    uint16_t OutPointer;     // 尾标记
    uint16_t FreeCount;      // 可用空间（单个数据尺寸为单位）
}SoftFifo;

// 动态创建 SoftFifo 对象
// buff - fifo的缓存地址
// buff_size - 缓存尺寸
SoftFifo *new_SoftFifo(uint8_t *buff, uint16_t buff_size);

// 初始化静态定义的 SoftFifo 对象（推荐）
// obj - 要操作的对象指针
// buff - fifo的缓存地址
// buff_size - 缓存尺寸
void SoftFifo_Init(SoftFifo *obj, uint8_t *buff, uint16_t buff_size);
bool SoftFifo_IsFull(SoftFifo *obj);
bool SoftFifo_IsEmpty(SoftFifo *obj);
bool SoftFifo_Write(SoftFifo *obj, uint8_t dat);
uint8_t SoftFifo_Read(SoftFifo *obj);

#ifdef __cplusplus
}
#endif

#endif
